import queue from '../queue';
import { showToast, hideLoading } from '../prompt';

/**
 * 【同步方法】获取处理后的接口请求结果对象
 * @param config 合并后的最终接口请求配置项对象
 * @param status 接口请求状态码
 * @param header 后端返回的响应头
 * @param data 后端返回的数据对象
 * @param type 预置的处理方式，如果配置了该项，那么status将失效，值域：queue-队列占用、timeout-请求超时、unifail-UNI框架报错
 * @return 接口请求结果对象
 */
function calldeal(config = {}, status = 200, header = {}, data = {}, type = '') {
    
    // 初始化返回数据
    let data_return = {
        "isSuccess": true, // 本次请求是否成功
        "statusCode": 200, // 状态码
        "errMsg": "请求成功", // 说明文字
        "header": {}, // 服务器返回的响应头
        "data": {}, // 服务器返回数据
    };
    
    // 状态码错误提示
    let tips_status = {
        "0": '出现未知错误，请检查连接状态',
        "1": '请继续执行操作',
        "2": '客户端请求成功',
        "3": '未能获取响应内容',
        "4": '请求发生错误，请检查数据',
        "5": '服务器内部错误',
        "6": '未返回响应头部',
    };
    
    // 如果不使用预置类型
    if (type == '' || !type)
    {
        // 转换状态码为数字类型
        let num_status = parseInt(status);
        // 取出状态码第一位字符
        let firstChar_status = status.toString().charAt(0);
        // 取出对应的状态码提示
        let str_tips = tips_status[firstChar_status] ? tips_status[firstChar_status] : tips_status["0"];
        
        // 如果服务器返回是正常状态
        if ((num_status >= 200 && num_status < 300) || (num_status === 304)) {
            // 本次请求是否成功 赋值
            data_return.isSuccess = true;
        }
        // 如果返回的是错误状态
        else {  data_return.isSuccess = false;  }
        // 结果状态码 赋值
        data_return.statusCode = num_status;
        // 说明文字 赋值
        data_return.errMsg = str_tips;
        // 服务器返回的响应头 赋值
        data_return.header = header;
        // 服务器返回数据 赋值
        data_return.data = data;
    }
    // 如果使用了预置类型
    else {
        // 队列占用情况
        if (type == 'queue')
        {
            // 结果状态码 赋值
            data_return.statusCode = 1001;
            // 说明文字 赋值
            data_return.errMsg = '该接口正在请求中，请稍候';
        }
        // 请求超时情况
        else if (type=='timeout')
        {
            // 结果状态码 赋值
            data_return.statusCode = 1002;
            // 说明文字 赋值
            data_return.errMsg = '请求超时';
        }
        // uni框架报错
        else if (type=='unifail')
        {
            // 取出对应的状态码提示
            let str_tips = (typeof(data)=='object' && data.errMsg) ? '请求失败，' + data.errMsg : tips_status["0"];
            // 结果状态码 赋值
            data_return.statusCode = 1003;
            // 说明文字 赋值
            data_return.errMsg = str_tips;
        }
        // 本次请求是否成功 赋值
        data_return.isSuccess = false;
        // 服务器返回的响应头 赋值
        data_return.header = header;
        // 服务器返回数据 赋值
        data_return.data = data;
    }
    
    // 除了“队列占用”类型，都要清除接口地址缓存
    if (data_return.statusCode != 1001) { queue('del', config["url"]); }
    // 如果前面是显示了loading框的话，现在要取消loading弹框
    if (config["loadingText"] != null) { hideLoading(); }
    // 如果需要进行错误提示
    if (config["openError"]==true && !data_return.isSuccess) { showToast(data_return.statusCode + ' ' + data_return.errMsg); }
    
    // 返回结果数据
    return data_return;
}

export default calldeal;